/**
 * 属性 “name”
 */
// function sayHi() {
//     console.info("Hi");
// }
// console.info(sayHi.name); //=>sayHi

//即使函数被创建时没有名字，名称赋值的逻辑也能给它赋予一个正确的名字，然后进行赋值
// let sayHi=function(){
//     console.info("Hi");
// }
// console.info(sayHi.name);   //=>sayHi

//当以默认值的方式完成了赋值时，它也有效：
// function f(sayHi=function(){}) {
//     console.info(sayHi.name);
// }
// f();        //=>sayHi

//规范中把这种特性叫做「上下文命名」。如果函数自己没有提供，那么在赋值中，会根据上下文来推测一个。对象方法也有名字
// let user={
//     sayHi(){
//         console.info("Hi");
//     },
//     sayBye:function(){
//         console.info("Bye");
//     }

// }
// user.sayHi();   //=>Hi
// user.sayBye();  //=>Bye

//有时会出现无法推测名字的情况。此时，属性 name 会是空
// let arr=[function(){}]
// console.info(arr[0].name);  //=> <空字符串>


/**
 * 属性 “length”
 */
// function f1(a){

// }
// function f2(a,b){
    
// }
// function many(a, b, ...more) {

// }
// console.info(f1.length); //=> 1
// console.info(f2.length); //=> 2
// console.info(many.length); //=> 2   //rest参数不计入length

//自定义属性
function sayHi() {
    console.info("Hi");
  
    // 计算调用次数
    sayHi.counter++;
}
sayHi.counter = 0; // 初始值

sayHi(); // Hi
sayHi(); // Hi
console.info(sayHi.counter );   //=>2